package jobascjp;

public class Mixer {
    Mixer(){}
    Mixer (Mixer m){ m1 = m;} // Adresse wird uebernommen, beide zeigen auf die gleiche Instanz
    Mixer m1;
    public static void main(String[] args) {
        Mixer m2 = new Mixer(); // m2 traegt m1 mit null als Attribut; m2 wird mit m1 als Attribut tatsächlich erzeugt und initialisiert, 2 m-Objekte auf Heap.
        Mixer m3 = new Mixer(m2); m3.go(); // m3 traegt ehemals m2 als Attribut m1; m3 zeigt auf m1, m2 und m1 auf Heap
        Mixer m4 = m3.m1; m4.go(); // m4 traegt m1 als Attribut m1 und das mit null! Jetzt kommt der go()-Call und es knallt NullPointer!
        Mixer m5 = m2.m1; m5.go();
    }
    void go(){ System.out.println("hi "); }
    /*
     * What is the result?
     * 
     * hi
     * hi hi
     * hi hi hi
     * Compilation fails.
     * hi, followed by an exception.
     * hi hi, followed by an exception.
     * 
     * Anmerkungen:
     * Recht tricky! Null Pointer bei m4.go()-Call siehe inline!
     */
}
